package com.learning.servlet2x.base;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * ClassName: LifeCycleServlet
 * Description: Servlet 生命周期测试
 * 1、继承 HttpServlet ，实现需要的方法
 * 2、配置 Web.xml
 * 3、调用(PostMan) http://localhost:8080/lifeCycleServlet
 * Date: 2014-9-25 10:30 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class LifeCycleServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public LifeCycleServlet() {
        System.out.println("调用 构造函数, 多次访问只被调用一次");
    }

    /**
     * 在构造方法之后，init()之前被调用, 只调用一次
     */
    @PostConstruct
    public void postConstruct() {
        System.out.println("调用 postConstruct()方法, 多次访问只被调用一次");
    }


    @Override
    public void init() {
        System.out.println("调用 init()方法 , 多次访问只被调用一次");
    }


    /**
     * 继承自 javax.servlet.Servlet
     * 这个方法中会去调用 javax.servlet.http.HttpServlet.service() 方法
     *
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("调用 Servlet接口的 service()方法 ");
        super.service(req, res);
    }

    /**
     * 继承自 javax.servlet.http.HttpServlet
     * 这个方法中会判断请求方式 然后分别调用 doGet()、doPost()等
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("调用 HttpServlet的  service()方法 ");
        super.service(req, resp);
    }


    /**
     * 只有以get方式调用该servlet的时候才会调用getLastModified
     * 返回-1 表示永远是最新的，不使用缓存
     * 在 doGet() 之前被调用
     *
     * @param req
     * @return
     */
    @Override
    protected long getLastModified(HttpServletRequest req) {
        System.out.println("调用 getLastModified()方法 ");
        return super.getLastModified(req);
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("调用 doGet()方法 ");
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("调用 doPost()方法 ");
    }


    @Override
    public void destroy() {
        System.out.println("调用 destroy()方法 ");
        super.destroy();
    }


    /**
     * 在destroy()之后，Servlet被彻底卸载之前调用，只调用一次
     */
    @PreDestroy
    public void preDestroy() {
        System.out.println("调用 preDestroy()方法, 多次访问只被调用一次");
    }
}

/*
【Get 调用输出】
调用 构造方法, 多次访问只被调用一次
调用 postConstruct()方法, 多次访问只被调用一次
调用 init()方法 , 多次访问只被调用一次

调用 Servlet接口的 service()方法
调用 HttpServlet的  service()方法
调用 getLastModified()方法
调用 doGet()方法

调用 Servlet接口的 service()方法
调用 HttpServlet的  service()方法
调用 getLastModified()方法
调用 doGet()方法


【Post 调用输出】
调用 Servlet接口的 service()方法
调用 HttpServlet的  service()方法
调用 doPost()方法

【UnDeploy 应用下线】
调用 destroy()方法
调用 preDestroy()方法, 多次访问只被调用一次

*/